//
//  main.cpp
//  TestOp
//
//  Created by Robin Guo on 2017/9/23.
//  Copyright © 2017年 Robin Guo. All rights reserved.
//

#include <iostream>
#include "TestOp.hpp"
#include "number.hpp"
#include "str.hpp"

using namespace std;

class complex {
private:
    double real;
    double image;
    
public:
    complex(double a=0,double b=0) { real = a,image = b;}
    friend complex operator+(complex x,complex y) {
        cout << "对象的重载方法" << endl;
        return complex(x.real + y.real,x.image + y.image);
    }
    
    friend complex operator+(complex &x,complex &y) {
        cout << "引用的重载方法" << endl;
        return complex(x.real + y.real,x.image + y.image);
    }
    
    friend complex operator+(complex &x,complex y) {
        return complex(x.real + y.real,x.image + y.image);
    }
    
    void show() {
        cout << "real : " << real << endl;
        cout << "image : " << image << endl;
    }
};

int main(int argc, const char * argv[]) {
    /*运算符重载
     
     C++由函数组成，运算符也是由函数来实现，只不过结合了operator关键字。例如 + 运算符，
     函数原型 ：operator+ (int,int);所有运算符重载实质就是函数重载
     
     友元运算符重载：友元函数 的意义就是让一个类的对象可以无限制的访问另一个类的所有成员；
     类运算符重载
     
     + - / * 等双目运算符最好使用友元重载。
     ++ -- 等单目运算符最好使用类运算符。
     因为单目运算符只改变自身的变量，而双目运算符设计到另一个对象的变量；
     
     成员运算符比友元函数少一个参数因为成员函数具有this指针；
     
     */
    
//    TestOp op(1,1.2,'w');
//    TestOp A,B;
//    
//    cout << "input i f ch :";
//    operator>>(cin,A);
//    cin>>B;
//    
//    cout << A << endl;
//    cout << B << endl;
//    
//    
//    if (A==B) {
//        cout << "A is Equal to B" << endl;
//    }else
//        cout << "A is Not Equal to B" << endl;
//
    /*
    number num(10);
    int i = ++num; cout << i << endl;
    number n0(11);
    int j = n0++;  cout << j << endl;
    */
    
    complex x(10.0,2.0),y;
    
//    y = x + 8;
//    y = 7 + y;
//    
//    y.show();
    str h("hello");
    str w("world");
    
    h.print();
    
    h=w;
    
    h.print();
    
    h="123";
    
    h.print();
    
    
    return 0;
}
